import os
import shutil
import tempfile
import win32com.client as win32
from docx import Document
from docx.oxml import parse_xml

def clean_insert_copy_table(doc_path, output_path, table_index=0):
    # 启动 Word 应用
    word = win32.Dispatch("Word.Application")
    word.Visible = False  # 后台运行

    try:
        doc = word.Documents.Open(doc_path)
        table = doc.Tables(table_index + 1)

        # Step 1: 复制表格
        table.Range.Copy()

        # Step 2: 获取表格结束位置
        insert_range = table.Range
        insert_range.Collapse(Direction=0)  # 折叠到表格后面

        # Step 3: 插入分页符，确保每个表格单独一页
        insert_range.InsertBreak(Type=7)  # 7 = wdPageBreak

        # Step 4: 粘贴表格副本
        insert_range.Collapse(Direction=0)
        insert_range.Paste()

        # Step 5: 删除分页符前后的多余换行符（如果存在）
        # 仅在表格后面清理换行符和分页符，而不影响文档的其它部分
        doc.Range(0, insert_range.Start).Find.ClearFormatting()
        doc.Range(0, insert_range.Start).Find.Replacement.ClearFormatting()

        # 删除分页符前后的多余换行符（仅处理表格和分页符之间的区域）
        doc.Range(insert_range.Start, insert_range.Start + 30).Find.Execute(FindText="\r", ReplaceWith="", Replace=2)
        doc.Range(insert_range.Start, insert_range.Start + 30).Find.Execute(FindText="\x0c", ReplaceWith="", Replace=2)  # 删除分页符

        # Step 6: 保存并关闭文档
        doc.SaveAs(output_path)
    except Exception as e:
        print(f"处理过程中出现错误: {e}")
    finally:
        doc.Close(False)
        word.Quit()


def ensure_tables_on_separate_pages(doc_path, output_path):
    word = win32.Dispatch("Word.Application")
    word.Visible = False

    try:
        doc = word.Documents.Open(doc_path)

        # Step 1: 获取所有表格的数量
        table_count = len(doc.Tables)

        # Step 2: 遍历文档中的每个表格，确保它们都单独占一页
        for table_index in range(table_count):
            table = doc.Tables(table_index + 1)  # Word的表格索引从1开始

            # Step 3: 获取表格之后的位置
            insert_range = table.Range
            insert_range.Collapse(Direction=0)  # 折叠到表格后

            # Step 4: 清理表格后多余的换行符或分页符
            clean_range = doc.Range(insert_range.Start, insert_range.Start + 30)  # 仅检查表格后30个字符范围
            clean_text = clean_range.Text.replace('\r', '').replace('\x0c', '')  # \x0c = 分页符
            if clean_text.strip() == "":
                clean_range.Delete()  # 删除空段落或多余的分页符

            # Step 5: 确保表格后有一个分页符
            insert_range.InsertBreak(Type=7)  # 插入分页符

        # Step 6: 删除可能的多余换行符或分页符（在分页符之间的区域）
        for table_index in range(table_count - 1):  # 确保处理相邻表格之间的换行符和分页符
            table1 = doc.Tables(table_index + 1)
            table2 = doc.Tables(table_index + 2)

            # 获取两个表格之间的区域
            range_after_table1 = doc.Range(table1.Range.End, table2.Range.Start)

            # 清理表格之间的多余换行符和分页符
            range_after_table1.Find.ClearFormatting()
            range_after_table1.Find.Replacement.ClearFormatting()

            # 删除换行符和分页符
            range_after_table1.Find.Execute(FindText="\r", ReplaceWith="", Replace=2)
            range_after_table1.Find.Execute(FindText="\x0c", ReplaceWith="", Replace=2)  # 删除分页符

            # 确保两个表格之间有且仅有一个分页符
            range_after_table1.InsertBreak(Type=7)  # 插入分页符

        # Step 7: 保存并关闭文档
        doc.SaveAs(output_path)
    except Exception as e:
        print(f"处理过程中出现错误: {e}")
    finally:
        doc.Close(False)
        word.Quit()


def test():
    path = 'D:\\workspace\\xizi\\AO'
    source_file_path = path + '\\F010203-01装配大纲Rev.7新版.docx'
    copied_file_path = path + '\\F010203-01装配大纲Rev.7新版-Test.docx'

    # 确保源文件存在
    if not os.path.exists(source_file_path):
        raise FileNotFoundError(f"源文件不存在: {source_file_path}")

    shutil.copy(source_file_path, copied_file_path)

    changed_file_path = path + '\\F010203-01装配大纲Rev.7新版-Test2222.docx'

    clean_insert_copy_table(copied_file_path, changed_file_path, 2)

    changed_file_path2 = path + '\\F010203-01装配大纲Rev.7新版-Test3333.docx'
    ensure_tables_on_separate_pages(changed_file_path, changed_file_path2)

    print(f"文档已保存到: {changed_file_path2}")
    os.startfile(changed_file_path2)


if __name__ == '__main__':
    test()
